#ifndef _VL_THREAD_LOOPER__H_
#define _VL_THREAD_LOOPER__H_

#include <thread>
#include <functional>

namespace VL {

/**
 * @Author: CimZzz
 * @Date: 2022-09-22 19:17:03
 * 
 * 线程循环
 * 生成对象即开启线程进行循环
 */
class VLThreadLooper {
public:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:18:21
	 * 
	 * 线程循环方法
	 * 
	 * 如果返回 true 表示继续线程循环
	 */
	using Looper = std::function<bool()>;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:19:37
	 * 
	 * 构造方法
	 * 
	 * @param looper 线程循环方法
	 */
	explicit VLThreadLooper(Looper looper);

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:20:06
	 * 
	 * 析构方法
	 */
	~VLThreadLooper();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:20:40
	 * 
	 * 停止线程循环
	 */
	void stop();

private:
	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:21:27
	 * 
	 * 执行线程循环方法
	 */
	void onThreadLoop();

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:21:07
	 * 
	 * 是否继续线程循环
	 */
	volatile bool isRunning;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:22:37
	 * 
	 * 线程循环方法
	 */
	Looper looper;

	/**
	 * @Author: CimZzz
	 * @Date: 2022-09-22 19:20:47
	 * 
	 * 线程
	 */
	std::thread thread;
};

}

#endif // _VL_THREAD_LOOPER__H_
